package com.cyw.baselibrary.imageloader;


import android.app.Activity;
import android.content.Context;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.util.Log;

import com.bumptech.glide.DrawableRequestBuilder;
import com.bumptech.glide.Glide;
import com.cyw.baselibrary.imageloader.GlideTransform.GlideRoundTransform;


/**
 * 实现使用Glide{@link Glide}加载图片
 * Created by ChenYuanWang on 2017.6.29.
 */
public class GlideImageLoaderStrategy implements BaseImageLoaderStrategy {

    private static final String TAG = "GlideImageLoaderStrategy";

    /**
     * 在这里可以进行一些异常的捕获，避免应用运行出错
     *
     * @param context
     * @return
     */
    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
    private boolean isException(Context context) {
        if (context == null) {
            Log.e(TAG, "上下文为null，本次取消加载图片");
            return true;
        }
        if (context instanceof Activity) {
            if (((Activity) context).isDestroyed()) {
                Log.e(TAG, "界面已经销毁，本次取消加载图片");
                return true;
            }
        }
        return false;
    }

    private DrawableRequestBuilder createDrawableRequestBuilder(ImageLoadBuilder builder) {
        DrawableRequestBuilder drawableRequestBuilder =
                Glide.with(builder.getContext())
                        .load(builder.getLoadObj())
                        .placeholder(builder.getPlaceHolder())
                        .dontAnimate();//为了避免glide加载图片的默认动画没有执行完导致CenterCrop属性的图片变形（再次加载时才正常），建议去除动画（或者自定义一个自己的动画）
        if (builder.getOverHeight() > 0 && builder.getOverWidth() > 0) {
            drawableRequestBuilder.override(builder.getOverWidth(), builder.getOverHeight());
        }
        return drawableRequestBuilder;
    }


    public void loadImage(ImageLoadBuilder builder) {
        //有可能应用界面被异常回收后我们传过来的是Context已经为null(或者在网络回调里面加载图片，此时
        // 界面可能已经销毁(已经不能返回到这个界面)，我们才去加载图片，而Glide检查到界面已经销毁后会
        // 报错)，此时再调用Glide加载图片会出现异常，可在这里统一处理，否则需要上层调用者单独处理(比
        // 较麻烦),情况比较少见（而且上层代码是可以控制的，比如：界面销毁后取消网络请求，不然在网络回
        // 调中加载图片会因为界面销毁而出问题），暂时屏蔽
//        if (isException(builder.getContext())) {
//            return;
//        }
        createDrawableRequestBuilder(builder).into(builder.getImgView());
    }


    /**
     * 加载默认图片
     */
    public void loadNormal(ImageLoadBuilder builder) {
        createDrawableRequestBuilder(builder).into(builder.getImgView());
    }


    /**
     * 加载圆形图片
     *
     * @param builder
     */
    public void loadRound(ImageLoadBuilder builder) {
        createDrawableRequestBuilder(builder).transform(new GlideRoundTransform(builder.getContext())).into(builder.getImgView());
    }

    /**
     * 加载圆角矩形图片
     *
     * @param builder
     */
    public void loadCorners(ImageLoadBuilder builder) {
        createDrawableRequestBuilder(builder).bitmapTransform(new GlideRoundTransform(builder.getContext())).into(builder.getImgView());

    }


}
